"""
    功能：Z评分模型
    作者：hwang_zhicheng
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 读取上市公司数据
# data_xls_1 = pd.read_excel("白酒上市公司交易额表.xls")
# data_xls_2 = pd.read_excel("白酒上市公司营收.xls")
data_xls_1 = pd.read_excel("ST+上市公司交易额表.xls")
data_xls_2 = pd.read_excel("ST+上市公司营收.xls")
# data_xls_1 = pd.read_excel("交通_Q3_1.xls")
# data_xls_2 = pd.read_excel("交通_Q3_2.xls")
# data_xls_3 = pd.read_excel("交通_Q3_3.xls")
# data_xls_1 = pd.read_excel("交通_Q4_1.xls")
# data_xls_2 = pd.read_excel("交通_Q4_2.xls")
# data_xls_3 = pd.read_excel("交通_Q4_3.xls")

# 读取上市公司数据
data_1 = data_xls_1.ix[:,
         ['收盘价_Clpr', '流通股_Trdshr', '已上市流通股_Lsttrdshr',
          '年收益率_Yrret', '年无风险收益率_Yrrfret', '每股净资产(元/股)_NAPS', '日期_Date', "上市状态_Listedstate"]].values

# print("data_1", data_1)
data_2 = data_xls_2.ix[:,
         ['流动负债合计(元)_Totcurlia', '非流动负债合计(元)_TotNcurlia', '负债合计(元)_Totlia',
          '营业收入(元)_Incmope', '资本公积(元)_Capsur', '所有者权益合计(元)_TotSHE',
          '利润总额(元)_Totalprf', '财务费用(元)_Finexp', '实收资本(或股本)(元)_Shrcap',
          '流动资产合计(元)_Totcurass', '非流动资产合计(元)_TotNcurass', '资产总计(元)_Totass', '截止日期_EndDt', "最新公司全称_Lcomnm"]].values

# print("data_2", data_2)
# print(data_2)
# print(data_3)
"""
资本公积(元)_Capsur
所有者权益合计(元)_TotSHE
利润总额(元)_Totalprf
财务费用(元)_Finexp
实收资本(或股本)(元)_Shrcap
"""

# 公司数据

# 公司年份数量
com_num = 3

# 收盘价_Clpr
Clpr_list = data_1[:, 0]
# print("Clpr_list", Clpr_list)
# 流通股_Trdshr
Trdshr_list = data_1[:, 1]
# print("Trdshr_list", Trdshr_list)
# 已上市流通股_Ltrdshr
Ltrdshr_list = data_1[:, 2]
# print("Ltrdshr_list", Ltrdshr_list)
# 每股净资产
NAPS_list = data_1[:, 5]
# print("NAPS_list", NAPS_list)
# 日期_Date
date_list = data_1[:, 6]
# 上市状态_Listedstate
State_list = data_1[:, 7]
# State_list
# print("date_list", date_list)
# print(date_list)
# date_year = date[1].year
# print(date_year)
# 股权市场价值列表
E_list = (Clpr_list * Ltrdshr_list) + (Trdshr_list - Ltrdshr_list) * NAPS_list
# print("E_list", E_list)
# 流动负债合计(元)_Totcurlia
SD_list = data_2[:, 0]
# print(SD_li)
# 非流动负债合计(元)_TotNCurLia
LD_list = data_2[:, 1]
# print(LD_li)
# 负债合计(元)_TotLia
D_list = data_2[:, 2]
# print("D_list：", D_list)
# 营业收入(元)_Incmope
Income_list = data_2[:, 3]
# 资本公积(元)_Capsur
Reserve_list = data_2[:, 4]
# 所有者权益合计(元)_TotSHE
Own_E_list = data_2[:, 5]
# 利润总额(元)_Totalprf
Totalprf_list = data_2[:, 6]
# 财务费用(元)_Finexp
Finexp_list = data_2[:, 7]
# 实收资本(或股本)(元)_Shrcap
Shrcap_list = data_2[:, 8]
# 流动资产合计(元)_Totcurass
Totcurass_list = data_2[:, 9]
# 非流动资产合计(元)_TotNcurass
TotNcurass_list = data_2[:, 10]
# 资产总计(元)_Totass
Totass_list = data_2[:, 11]
# 截止日期_EndDt
EndDt_list = data_2[:, 12]
# 最新公司全称_Lcomnm
Lconnm_list = list(data_2[:, 13][::com_num])
# Lconnm_list.replace("*ST", "ST", inplace=1)
# len(Lconnm_list)
"""
Z计分模型的判别函数如下:
      Z =0.012X1+0.014X2+0.033X3+0.006X4+0.999X5
 2.Z计分模型应用分析的前期准备
    Z计分模型主要用于预测企业财务失败或破产的可能性，也可用于判定企业经营的状况，是目前在财务分析中最常用的一种模型，故本文首先用z计分模型来进行判别分析。先根据z计分模型分别计算三家乳品企业的z值，再按z值对企业进行比较和分析。
其中：
    X1=营运资金/资产总额=(流动资产一流动负债)/资产总额
    该比率反映企业资产的流动性和分布状况，比率越高说明资产的流动性越强，财务失败的可能越小：
    X2=留存收益/资产总额=(股东权益一股本一资本公积)/资产总额
    该比率反映企业的积累水平，比率越高说明企业的积累水平越高，财务失败的可能越小：
    X3=息税前利润/资产总额=(利润总额+利息费用)/资产总额
    该比率反映企业的获利水平，比率越高说明企业的获利能力越强，财务失败的可能越小：
    X4=股东权益市价/负债总额=（非流通股总股数+流通股）*每股市价/负债总额
    该比率反映企业所有者权益(或净产)与企业债务之间的关系，比率越高，说明企业所有者权益越高或净资产越高，企业财务失败的可能性就越小
    X5=营业收入/资产总额：
    该比率反映企业总资产的周转速度或营运能力，比率越高说明企业的资产利用率越高，效果也越好。
    （X3中的利息费用无法直接从年报中获取，故以财务费用代替，对结果应无实质性影响;X4中的每股市价以股票当年股市收盘价计算。）
"""


def Z_count(X):
    """
        功能：计算Z值并返回
    """
    Z = 0.012 * X[0] + 0.014 * X[1] + 0.033 * X[2] + 0.006 * X[3] + 0.999 * X[4]
    # Z = 0.065 * X[0] + 0.326 * X[1] + 0.01 * X[2] + 0.067 * X[3]
    return Z


def read_data():
    """
        功能：读取数据
    """
    pass


def X_count(i):
    """
        功能：计算x1~x5的值
    """
    x1 = (Totcurass_list[i] - SD_list[i]) / Totass_list[i]
    x2 = (Own_E_list[i] - Shrcap_list[i] - Reserve_list[i]) / Totass_list[i]
    x3 = (Totalprf_list[i] + Finexp_list[i]) / Totass_list[i]
    x4 = E_list[i] / D_list[i]
    x5 = Income_list[i] / Totass_list[i]
    print("[x1, x2, x3, x4, x5]", [x1, x2, x3, x4, x5])
    return [x1, x2, x3, x4, x5]


"""
Z<2.675，借款被划入违约组；
反之，如果Z≥2.675，则借款人被划入非违约组。
当1.81<Z<2.99阿尔特曼发现此时的判断失误比较大，称该重叠区域为未知区
"""


def main():
    """
        主函数
    """
    Company_name = Lconnm_list

    Z_list = []
    number = 0

    for i in range(int(data_1.shape[0])):
        X = X_count(i)
        Z = Z_count(X)

        Z_list.append(Z * 100)
        Z_list_length = len(Z_list)

        # print("Z_list_length = {}".format(Z_list_length))
        # print("i = {}".format(i))

        # print("Z_list = {}".format(Z_list[i - 2: i]))

        # if Z_list_length % 3 == 0 and Z_list_length != 0:
        #     # print("Z_list", Z_list)
        #     plt_tle = Company_name[number] + "16年到18年Z值统计"
        #     height_list = Z_list[i - 2: i + 1]
        #     # 绘制条形图
        #     rects1 = plt.bar(x=range(1, 6, 2), height=height_list, width=1, alpha=0.8, color='red')
        #     # plt.ylim(0, 1)  # y轴取值范围
        #     # 设置x轴坐标点显示
        #     tick_labels = ["2016", "2017", "2018"]
        #     tick_pos = np.arange(1, 7, 2)
        #     plt.xticks(tick_pos, tick_labels)
        #     plt.title(plt_tle, size=16)
        #     plt.xlabel("年份", size=10)
        #     plt.ylabel("Z值", size=10)
        #     # plt.legend()     # 设置题注
        #
        #     for a, b in zip(tick_pos, height_list):
        #         plt.text(a, b + 0.02, '%.4f' % b, ha='center', va='bottom', fontsize=10)
        #
        #     plt.show()
        #     # Z列表初始化
        #     # Z_list = []
        #     number += 1

    print("Z_list = {}".format(Z_list))
    predict_list = []
    error_num = 0
    correct_num = 0
    for i in range(len(Z_list)):
        if Z_list[i] >= 2.675:
            predict_list.append("Norm")
        elif Z_list[i] < 2.675:
            predict_list.append("ST")

    for i in range(len(State_list)):
        if State_list[i] == "*ST":
            State_list[i] = "ST"

    print("State_list = {}".format(State_list))
    for i in range(len(predict_list)):
        if predict_list[i] == State_list[i]:
            correct_num += 1
        else:
            error_num += 1

    print("predict_list = {}".format(predict_list))
    plt_tle = "预测结果"
    height_list = [correct_num, error_num]
    # 绘制条形图
    rects1 = plt.bar(x=range(1, 4, 2), height=height_list, width=1, alpha=0.8, color='red')
    # plt.ylim(0, 1)  # y轴取值范围
    # 设置x轴坐标点显示
    tick_labels = ["correct_num", "error_num"]
    tick_pos = np.arange(1, 4, 2)
    plt.xticks(tick_pos, tick_labels)
    plt.title(plt_tle, size=16)
    plt.xlabel("结果", size=10)
    plt.ylabel("计数", size=10)
    # plt.legend()     # 设置题注

    for a, b in zip(tick_pos, height_list):
        plt.text(a, b + 0.02, '%.4f' % b, ha='center', va='bottom', fontsize=10)

    plt.show()


if __name__ == '__main__':
    main()

"""
Z<2.675，借款被划入违约组；
反之，如果Z≥2.675，则借款人被划入非违约组。
当1.81<Z<2.99阿尔特曼发现此时的判断失误比较大，称该重叠区域为未知区
"""

# Company_name = ["新疆伊力特实业股份有限公司",
#                 "安徽金种子酒业股份有限公司",
#                 "贵州茅台酒股份有限公司",
#                 "河北衡水老白干酒业股份有限公司",
#                 "舍得酒业股份有限公司",
#                 "四川水井坊股份有限公司",
#                 "山西杏花村汾酒厂股份有限公司",
#                 "安徽迎驾贡酒股份有限公司",
#                 "江苏今世缘酒业股份有限公司",
#                 "安徽口子酒业股份有限公司",
#                 "金徽酒股份有限公司"]

# ["江苏保千里视像科技集团股份有限公司",
#             "大唐电信科技股份有限公司",
#             "哈尔滨空调股份有限公司",
#             "罗顿发展股份有限公司",
#             "吉林成城集团股份有限公司",
#             "亿阳信通股份有限公司",
#             "安源煤业集团股份有限公司",
#             "抚顺特殊钢股份有限公司",
#             "柳州化工股份有限公司",
#             "太原狮头水泥股份有限公司",
#             "上海中毅达股份有限公司",
#             "上海富控互动娱乐股份有限公司",
#             "湖南天雁机械股份有限公司",
#             "哈尔滨工大高新技术产业开发股份有限公司",
#             "西藏旅游股份有限公司",
#             "新疆友好(集团)股份有限公司",
#             "山东天业恒基股份有限公司",
#             "中石化石油工程技术服务股份有限公司",
#             "中国嘉陵工业股份有限公司(集团)",
#             "览海医疗产业投资股份有限公司",
#             "甘肃蓝科石化高新装备股份有限公司"]
